/**
@mainpage

<h1>Aplikacja do wymiany plików peer-to-peer z serwerem centralnym</h1>
<hr>
<center>Sylwia Szymczyk - Łukasz Bogusz - Maciej Stefańczyk - Kacper Szkudlarek</center>


<h2>.: Cel projektu</h2>
<hr>
	 Przedmiotem projektu jest implementacja serwera i klienta aplikacji do wymiany plików
  na zasadzie peer-to-peer. Serwer przechowuje scentralizowany katalog plików
  udostępnianych przez użytkowników, wymiana plików odbywa się bezpośrednio pomiędzy
  klientami. Aplikacje klienckie informują serwer o posiadanych zasobach, zgłaszają
  zapytania, informują o odłączeniu się z sieci, itp. Serwer oraz klienci muszą obsługują
  jednocześnie wiele połączeń (zapytania, pobieranie plików).

	 W przypadku, gdy ten sam zasób dostępny jest u wielu użytkowników, to pobierany jest
  on we fragmentach od każdego z nich.

	 System jest odporny na nagłe zerwanie połączenia pomiędzy użytkownikami bądź do serwera.




<h2>.: Podział na moduły</h2>
<hr>
Projekt jest podzielony na trzy główne moduły:
- @ref Network "obsługa sieci"
- @ref Client "klient"
- @ref Server "serwer"

Moduł sieciowy jest wykorzystywany zarówno przez klienta, jak i przez serwer.

<h2>.: Zasada działania</h2>
<hr>
Protokół komunikacji oprarty jest na połączeniach TCP. Wszystkie informacje przesyłane są
w odpowiednio przygotowanych @ref Network::Packet "pakietach". Na praktycznie każdy wysłany pakiet
(niezależnie, czy do przy połączeniu klient-klient, czy klient-serwer) wysyłana jest odpowiedź
potwierdzająca przetworzenie pakietu. @ref Network::Packet "więcej o rodzajach pakietów"

@par Monitorowanie statusu połaczeń po stronie klienta

Cały czas monitorowany jest status połączeń. W wypadku zerwania połączenia z serwerem klient
cyklicznie co okreslony czas próbuje nawiązać nowe połączenie.

W przypadku zerwania połączenia z klientem sprawdzane są wszystkie zadania pobierania, i w sytuacji
gdy któreś z nich czeka na pakiet od odłączonego klienta jest on usuwany z listy dla tego zadania
i zwalniany jest slot przez niego okupowany.

@par Monitorowanie statusu połączeń po stronie serwera

W momencie, gdy serwer dostanie informację, że jeden z klientów zerwał połączenie wykonywana
jest ta sama operacja, co podczas wylogowania klienta.

<h2>.: Podstawowe scenariusze działania</h2>
<hr>
@par Logowanie do systemu

Podczas uruchamiania aplikacji klienckiej w pliku konfiguracyjnym sprawdzane jest ID danego klienta.
Jesli zostanie ono znalezione, to do serwera wysyłany jest pakiet ptLogin z zakodowanym odczytanym ID.
W odpowiedzi serwer odsyła pakiet ptInfo z informacją, czy logowanie się powiodło czy nie (jeśli
jest już zalogowany klient o danym id badź dane ID nie zostało jeszcze zarejestrowane).

Jeśli ID nie zostało odnalezione, do serwera wysyłany jest pakiet ptIDRequest, na który serwer odpowiada
pakietem ptNewID, w którym umieszczony jest ID przyznany klientowi. Poźniej klient wykonuje zwykłe logowanie.

Po wysłaniu pakietu ptLogout na serwerze zgłąszający klient jest usuwany z listy aktywnych.
Wylogowanie z serwera jest opcjonalne - jeśli nie nastąpi jawne wysłanie tego pakietu, to serwer zareaguje
na zerwane połaczenie w taki sam sposób, jakby dostał pakiet ptLogout.

@a Uwaga:

W obecnej wersji programu nawet po wysłaniu pakietu ptLogout połączenie z klientem nei jest jawnie zrywane,
tak więc możliwa jest sytuacja, gdy ktoś pomimo statusu wylogowanego pobiera z serwera listę plików oraz
klientów posiadających pliki. Nie wpływa to jednak w negatywny sposób na działanie aplikacji, a jest
jedynie usprawnieniem, które można wprowadzić w momencie dalszego rozwoju projektu.

@par Rejestrowanie plików

Serwer przechowuje centralny @ref Server::Model "katalog plików" wraz z informacją o klientach, którzy dany plik posiadają.
W celu dodania pliku do udostepniania klient wysyła do serwera pakiet ptFileList z zapisaną informacją
o zmianach dokonanych w jego liście plików (dodawanie/modyfikacja/usuwanie). Zmiany te są wprowadzane
na serwerze.

@a Uwaga:

W obecnej wersji obsługiwane jest jedynie dodawanie nowych plików. Podczas dalszego rozwoju projektu
pozostałe funkcje powinny zostać dodane.

@par Wyszukiwanie plików

Aby pobrać jakiś plik z sieci klient musi wykonać dwa kroki:

Wyszukiwanie plików - do serwera wysyłany jest pakiet ptFind wraz z parametrami zapytania wpisanymi przez
klienta (fragment nazwy poszukiwanego pliku, ew. ograniczenie na typ i/lub wielkość pliku). W odpowiedzi
od serwera przychodzi pakiet ptList zawierający liste plików spełniających kryteria wyszukiwania (lista
może nie zawierać żadnych plików, jeśli zapytanie nei zwróciło żadnych poprawnych wyników).

Po wybraniu pliku ze zwróconej listy dodawane jest nowe @ref Client::Job "zadanie pobierania", a do serwera
wysyłany jest pakiet ptfindSeeds z żądaniem wyszukania zalogowanych posiadaczy danego pliku. W odpowiedzi
przychodzi pakiet ptListSeeds, w którym zawarte są informacje o ID oraz adresie klientów.

@par Pobieranie pliku od innego klienta/klientów

Wszystkie zadania pobierania obsługiwane są cyklicznie. Dla każdego zadania sprawdzana jest lista
klientów, którzy posiadają dany plik. Jeśli są mamy wolny slot dla danego zadania (dla każdego zadania
może byc ograniczona liczba klientów, od których jednoczesnie pobierany jest plik) to z listy klientów
udostępniających wybierany jest pierwszy niepołaczony, a nastepnie wysyłany jest do niego pakiet ptGet
(żądanie wysłania fragmentu pliku). W odpowiedzi na ten pakiet przychodzi ptGive, w którym zawarty jest
fragment żądany wcześniej fragment pliku.

Po odebraniu tego fragmentu jest on zapisywany na dysku, oraz zapamiętywana jest informacja o numerze
ściągniętego pakietu. Jesli ściągnięte zostaną wszystkie pakiety zadanie zmienia status na ukończone
i nie bierze udziału w dalszym przetwarzaniu. Wszystkie pobrane pliki zapisywane są w folderze "downloads".

<h2>.: Uwagi końcowe</h2>
<hr>
Założenia z dokumentacji wstepnej projektu zostały zrealizowane.

Na niektórych systemach do działania wymagane mogą być następujące biblioteki:

- libfreetype6-dev
- libfontconfig-dev
- libxrender-dev
- libsm-dev
- libglib2.0-dev
- libxext-dev
- libxext6-dbg
- x11proto-xext-dev

<h2>.: Dobre słowo dla autorów wykorzystanych bibliotek, narzędzi oraz zasobów</h2>
<hr>
- Qt - A cross-platform application and UI framework [ http://www.qtsoftware.com/ ]
- Buuf by =mattahan [ http://mattahan.deviantart.com/art/Buuf-37966044 ]

Wszystkie wymienione wyżej narzędzia oraz zasoby wykorzystane zostały zgodnie z ich licencją.

@tableofcontents
**/
